// 需要先运行 npm install axios @types/axios
import axios from 'axios';
import { ITranslationService } from './interfaces/ITranslationService';
import { ModelConfigReader } from '../config/ModelConfig';


export class DeepSeekTranslationService implements ITranslationService {
  private apiUrl: string = 'https://api.deepseek.com/v1/chat/completions';
  private apiKey: string = '';
  private modelName: string = 'deepseek-chat';
  private temperature: number = 0.3;
  private maxTokens: number = 1024;
  
  constructor() {
    // 在构造函数中初始化配置
    this.initConfig();
  }
  
  private async initConfig() {
    try {
      const config = await ModelConfigReader.read('DEEPSEEK_V3');
      this.apiKey = config.apiKey;
      this.apiUrl = `${config.baseUrl}/chat/completions`;
      this.modelName = config.modelName;
      this.temperature = config.temperature || 0.3;
      this.maxTokens = config.maxTokens || 1024;
    } catch (error) {
      console.error('Failed to load API configuration:', error);
    }
  }

  async translate(sourceLang: string, targetLang: string, text: string, preference?: Map<string, string>): Promise<string> {
    console.log('Key:', this.apiKey);
    
    // 构建基础提示词
    let systemPrompt = `你是一个翻译专家，请把以下的文字从${sourceLang}，翻译为${targetLang}。`;
    
    // 根据偏好设置调整提示词
    if (preference && preference.size > 0) {
      // 长度偏好
      if (preference.has('length')) {
        const lengthPref = preference.get('length');
        if (lengthPref === 'short') {
          systemPrompt += '请保持翻译简短精炼。';
        } else if (lengthPref === 'extended') {
          systemPrompt += '请提供详尽的翻译，可以适当扩展内容以确保完整表达。';
        }
      }
      
      // 语气偏好
      if (preference.has('tone')) {
        const tonePref = preference.get('tone');
        if (tonePref === 'casual') {
          systemPrompt += '请使用随意、口语化的语气进行翻译。';
        } else if (tonePref === 'formal') {
          systemPrompt += '请使用正式、专业的语气进行翻译。';
        }
      }
      
      // 风格偏好
      if (preference.has('style')) {
        const stylePref = preference.get('style');
        if (stylePref === 'free') {
          systemPrompt += '请进行意译，注重表达原文的含义而非逐字翻译。';
        } else if (stylePref === 'creative') {
          systemPrompt += '请进行创意改编，在保持原意的基础上使翻译更具表现力和吸引力。';
        } else if (stylePref === 'literal') {
          systemPrompt += '请尽可能进行直译，保持原文的结构和表达方式。';
        }
      }
      
      // 复杂度偏好
      if (preference.has('complexity')) {
        const complexityPref = preference.get('complexity');
        if (complexityPref === 'simple') {
          systemPrompt += '请使用简单易懂的词汇和句式，避免使用专业术语。';
        } else if (complexityPref === 'expert') {
          systemPrompt += '请使用专业术语和复杂句式，适合该领域的专家阅读。';
        }
      }
    }
    
    // 构建消息数组，包含system和user两个角色
    console.log(systemPrompt);
    const messages = [
      {
        role: 'system',
        content: systemPrompt
      },
      {
        role: 'user',
        content: text
      }
    ];
    
    // 构建请求体
    const requestBody = {
      model: 'deepseek-chat', // 使用ModelConfig中的modelName更好
      messages: messages,
      temperature: 0.3, // 降低随机性以提高翻译准确性
      max_tokens: 1024
    };
    
    const response = await axios.post(this.apiUrl, requestBody, {
      headers: {
        'Authorization': `Bearer ${this.apiKey}`,
        'Content-Type': 'application/json'
      }
    });

    // 从响应中提取翻译结果
    return response.data.choices[0].message.content;
  }

  async autoDetectTranslate(targetLang: string, text: string, preference?: Map<string, string>): Promise<{ detectedLang: string; translation: string }> {
    // 构建基础提示词
    let systemPrompt = `你是一个翻译专家，请检测以下文本的语言并将其翻译为${targetLang}。`;
    
    // 根据偏好设置调整提示词
    if (preference && preference.size > 0) {
      // 长度偏好
      if (preference.has('length')) {
        const lengthPref = preference.get('length');
        if (lengthPref === 'short') {
          systemPrompt += '请保持翻译简短精炼。';
        } else if (lengthPref === 'extended') {
          systemPrompt += '请提供详尽的翻译，可以适当扩展内容以确保完整表达。';
        }
      }
      
      // 语气偏好
      if (preference.has('tone')) {
        const tonePref = preference.get('tone');
        if (tonePref === 'casual') {
          systemPrompt += '请使用随意、口语化的语气进行翻译。';
        } else if (tonePref === 'formal') {
          systemPrompt += '请使用正式、专业的语气进行翻译。';
        }
      }
      
      // 风格偏好
      if (preference.has('style')) {
        const stylePref = preference.get('style');
        if (stylePref === 'free') {
          systemPrompt += '请进行意译，注重表达原文的含义而非逐字翻译。';
        } else if (stylePref === 'creative') {
          systemPrompt += '请进行创意改编，在保持原意的基础上使翻译更具表现力和吸引力。';
        } else if (stylePref === 'literal') {
          systemPrompt += '请尽可能进行直译，保持原文的结构和表达方式。';
        }
      }
      
      // 复杂度偏好
      if (preference.has('complexity')) {
        const complexityPref = preference.get('complexity');
        if (complexityPref === 'simple') {
          systemPrompt += '请使用简单易懂的词汇和句式，避免使用专业术语。';
        } else if (complexityPref === 'expert') {
          systemPrompt += '请使用专业术语和复杂句式，适合该领域的专家阅读。';
        }
      }
    }
    
    // 添加JSON格式要求
    systemPrompt += `请以JSON格式：{'detectedLang': '检测到的语言'，'translation': '翻译后的文本'}返回`;
    
    // 构建消息数组，包含system和user两个角色
    console.log(systemPrompt);
    const messages = [
      {
        role: 'system',
        content: systemPrompt
      },
      {
        role: 'user',
        content: text
      }
    ];
    
    // 构建请求体
    const requestBody = {
      model: 'deepseek-chat', // 使用ModelConfig中的modelName更好
      messages: messages,
      temperature: 0.3,
      max_tokens: 1024
    };
    
    const response = await axios.post(this.apiUrl, requestBody, {
      headers: {
        'Authorization': `Bearer ${this.apiKey}`,
        'Content-Type': 'application/json'
      }
    });

    // 从响应中提取结果
    const content = response.data.choices[0].message.content;
    
    try {
      // 尝试解析JSON响应
      // 首先尝试直接解析完整的JSON字符串
      let parsedContent;
      try {
        parsedContent = JSON.parse(content);
      } catch (jsonError) {
        // 如果直接解析失败，尝试从文本中提取JSON部分
        const jsonMatch = content.match(/\{[\s\S]*\}/); // 匹配最外层的花括号及其内容
        if (jsonMatch) {
          try {
            parsedContent = JSON.parse(jsonMatch[0]);
          } catch (extractError) {
            // 如果提取的JSON解析失败，抛出原始错误
            throw jsonError;
          }
        } else {
          // 如果没有找到JSON格式的内容，抛出原始错误
          throw jsonError;
        }
      }
      
      // 验证解析后的内容是否包含所需字段
      if (parsedContent && typeof parsedContent === 'object') {
        return {
          detectedLang: parsedContent.detectedLang || 'unknown',
          translation: parsedContent.translation || content
        };
      } else {
        throw new Error('Invalid response format');
      }
    } catch (error) {
      // 如果无法解析JSON，则尝试从文本中提取信息
      console.error('Failed to parse JSON response:', error);
      return {
        detectedLang: 'unknown',
        translation: content // 返回原始内容作为翻译
      };
    }
  }
}